package com.bytecodes.eaulas.mantenimiento;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import java.sql.*;
import java.text.SimpleDateFormat;


import com.bytecodes.eaulas.beans.Rol;
import com.bytecodes.eaulas.beans.Usuario;


/**
 * Clase Gestora de Usuarios
 * 
 * @author David Fern�ndez G�mez
 * @version PAC4
 */

public class GestorUsuarios {
	private Connection conn = null;

	public GestorUsuarios(Connection conn ) {
		this.conn = conn;
	}

	/**
	 * Obtiene la conexion actual con la BD
	 * 
	 * @return la conexion actual con la Bd.
	 */
	public Connection getConnection() {
		return conn;
	}

	/**
	 * Devuelve una lista con los usuarios del sistema que cumplen el filtro pasado como par�metro
	 * 
	 * @param: filtro a aplicar a los usuarios del sistema
	 * @return: lista de usuarios que cumplen el filtro
	 */
	public List<Usuario> getUsuarios(String filtro) throws Exception {
		return null;
	}	

	/**
	 * Devuelve el usuario que tiene como c�digo el par�metro pasado
	 * 
	 * @param: codigo del usuario a buscar
	 * @return: usuario a buscar
	 */
	public Usuario getUsuario(String codUsuario) throws Exception {
                return null;
	}	

	/**
	 * Inserta un usuario en a base de datos
	 * 
	 * @param: el usuario a insertar en la base de datos
	 * @return: true si todo ha sido bien, false en caso contrario
	 */
	public Boolean InsertaUsuario(Usuario pUsuario, String idUsuarioCreador) throws Exception {
		Date fechaActual = new Date();
       	SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
       	String cadenaFecha = formato.format(fechaActual);
       	Statement sentencia = conn.createStatement();
		String query = "INSERT INTO users(userid, password, name, surname1, surname2, company, address, postal_code, city, telephone, mobile_phone, roleid, email, creation_date, creation_user)"+
		                            "VALUES ('"+pUsuario.getCodUsuario()+"','"
											  +pUsuario.getPassword()+"','"
		                                      +pUsuario.getNombre()+"','"
		                                      +pUsuario.getApellido1()+"','"
		                                      +pUsuario.getApellido2()+"','"
		                                      +pUsuario.getCompania()+"','"
		                                      +pUsuario.getDireccion()+"',"
		                                      +pUsuario.getCodPostal()+",'"
		                                      +pUsuario.getLocalidad()+"',"
		                                      +pUsuario.getTelefono()+","
		                                      +pUsuario.getTelfMovil()+","
		                                      +pUsuario.getRolId()+",'"
		                                      +pUsuario.getEmail()+"','"
		                                      +cadenaFecha+"','"
		                                      +idUsuarioCreador+"')";
	
       	try {
       		sentencia.execute(query);

       	}
       	catch (SQLException e) {
    		e.printStackTrace();	
    		return Boolean.FALSE;
    	}
        return Boolean.TRUE;
	}	
        
        
	public List<Usuario> getTotal() throws Exception {
                System.out.println("Consulta de los Usuarios...");
                List<Usuario> listaUsuarios = new ArrayList<Usuario>();	
                Statement st = null;
                ResultSet rs = null;
                try {
                    st = conn.createStatement();
                    String select = "select userid,name,surname1,surname2 from users Order by userid";
                    
                    rs = st.executeQuery(select);
                    while (rs.next()) {
     			Usuario usuario = new Usuario();                        
                        usuario.setCodUsuario(rs.getString("userid"));
                        usuario.setNombre(rs.getString("name"));
                        usuario.setApellido1(rs.getString("surname1"));
                        usuario.setApellido2(rs.getString("surname2"));                                
                        listaUsuarios.add(usuario);
                    }
                }catch (SQLException e) {
                        e.printStackTrace();			
                }
                finally{
                        try{
                            rs.close();
                           st.close();
                            }catch(Exception e){
                                e.printStackTrace();
                            }
                        }
                System.out.println("Consulta finalizada!");
                return listaUsuarios;
	}	
       
	public List<Rol> getRoles(){
		  List<Rol> listaRoles = new ArrayList<Rol>();	
          Statement st = null;
          ResultSet rs = null;
          try {
              st = conn.createStatement();
              String select = "select * from all_roles";         
              rs = st.executeQuery(select);
              while (rs.next()) {
            	  Rol  rol = new Rol();                        
                  rol.setDescripcion(rs.getString("roledescription"));
                  rol.setId(rs.getInt("roleid"));         
                  listaRoles.add(rol);
              }
          }catch (SQLException e) {
                  e.printStackTrace();			
          }
		return listaRoles;
	}

	public Boolean eliminaUsuario(String identificador, String idUsuarioCreador) {
		Date fechaActual = new Date();
       	SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
       	String cadenaFecha = formato.format(fechaActual);
		Statement sentencia;
		 try {
			 sentencia = conn.createStatement();
			 String delete = "update users set inactivation_date='"+cadenaFecha+"',"+
			 				 " inactivation_user='"+idUsuarioCreador+"'"+
			 				 " WHERE userid='"+identificador+"'";
			 sentencia.executeUpdate(delete);
		} catch (SQLException exception) {
			return false;
		}
		return true;
	}

	public Boolean updateUsuario(Usuario usuario, String idUsuarioCreador) {
		Date fechaActual = new Date();
       	SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
       	String cadenaFecha = formato.format(fechaActual);
		Statement sentencia;
		 try {
			 sentencia = conn.createStatement();
			 String update = "update users set name='"+usuario.getNombre().trim()+"',"+
			 				 " surname1='"+usuario.getApellido1().trim()+"',"+
			 				 " surname2='"+usuario.getApellido2().trim()+"',"+
			 				 " company='"+usuario.getCompania().trim()+"',"+
			 				 " address='"+usuario.getDireccion().trim()+"',"+
			 				 " postal_code="+usuario.getCodPostal().trim()+","+
			 				 " city='"+usuario.getLocalidad().trim()+"',"+
			 				 " telephone="+usuario.getTelefono().trim()+","+
			 				 " mobile_phone="+usuario.getTelfMovil().trim()+","+
			 				 " email='"+usuario.getEmail().trim()+"'"+
			 				 " WHERE userid='"+usuario.getCodUsuario().trim()+"'";
			 sentencia.executeUpdate(update);
		} catch (SQLException exception) {
			return false;
		}
		return true;
	}
}
